/**
 * 
 */
package pingyin_sort;

import java.io.UnsupportedEncodingException;
import java.util.List;

import net.sourceforge.pinyin4j.PinyinHelper;

/**
 *GBK汉字中文拼音排序
 */
public class GBK_TOOL {
	 /**
	  * 这个只是实现简体常用的中文排序 GBK中扩充部分就不能准确严格的排序了
	  * 将字符串集合按GBK编码(简体字按拼音顺序)排序
	  * 常见字符集名称：ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等
	  * java默认Unicode，系统默认GBK
	  * 参考：http://blog.csdn.net/northridgerecluse/article/details/40740357
	  */
	 public static int compare1(String str1,String str2){
	  try {
	   byte[] b1 = str1.getBytes("GBK");
	   byte[] b2 = str2.getBytes("GBK");
	   int l1=b1.length;
	   int l2=b2.length;
	   int l=Math.min(l1, l2);
	   int k=0;
	   while(k<l){
	    byte bt1=b1[k];
	    byte bt2=b2[k];
	    if(bt1!=bt2)
	     return bt1-bt2;
	    k++;
	   }
	   return l1-l2;
	  } catch (UnsupportedEncodingException e) {
	   e.printStackTrace();
	  }
	  return 0;
	 }
	 public static void sort(List<String> list){
	  int size=list.size();
	  if(size<=1)
	   return;
	  for(int i=1;i<size;i++){
	   for(int j=i;j>0;j--){
	    if(compare1(list.get(j), list.get(j-1))<0){
	     String temp=list.get(j);
	     list.set(j, list.get(j-1));
	     list.set(j-1, temp);
	    }else{
	     break;
	    }
	   }
	  }
	 }
	 
	 /**
	  * 这种方式是严格的拼音排序
	  * 1.gbk编码怎么进行java拼音排序呢？gbk编码和拼音关系。 gb2312<gbk([B0-D7]是gb2312) gb2312是拼音排序的，gbk简体字是按拼音排序的，扩充的新的部分就不是严格的拼音排序的了。怎么实现严格的排序呢，实现严格的排序策略把汉字转成拼音再比较。
		http://blog.csdn.net/wqjsir/article/details/7544208
	  */
	 
	 public int compare(String o1, String o2) {  
		  
		    for (int i = 0; i < o1.length() && i < o2.length(); i++) {  
		  
		        int codePoint1 = o1.charAt(i);  
		        int codePoint2 = o2.charAt(i);  
		  
		        if (Character.isSupplementaryCodePoint(codePoint1)  
		            || Character.isSupplementaryCodePoint(codePoint2)) {  
		        i++;  
		        }  
		  
		        if (codePoint1 != codePoint2) {  
		        if (Character.isSupplementaryCodePoint(codePoint1)  
		            || Character.isSupplementaryCodePoint(codePoint2)) {  
		            return codePoint1 - codePoint2;  
		        }  
		  
		        String pinyin1 = pinyin((char) codePoint1);  
		        String pinyin2 = pinyin((char) codePoint2);  
		  
		        if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字  
		            if (!pinyin1.equals(pinyin2)) {  
		            return pinyin1.compareTo(pinyin2);  
		            }  
		        } else {  
		            return codePoint1 - codePoint2;  
		        }  
		        }  
		    }  
		    return o1.length() - o2.length();  
		    }  
		  
		    /** 
		     * 字符的拼音，多音字就得到第一个拼音。不是汉字，就return null。 
		     */  
		    private static String pinyin(char c) {  
		    String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);  
		    if (pinyins == null) {  
		        return null;  
		    }  
		    return pinyins[0];  
		    }  
}
